/* PROBLEME N° 3
 * Trouver le plus grand facteur premier dans la décomposition
 * en facteurs premiers du nombre 600851475143
 *
 * Résolu le Jeudi 14 Janvier 2010 à 20:24
 * 0m 0.214s
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int premier(int);
int * listePremiers(long);

int main(int argc, char *argv[])
{
    long long n = 600851475143L;
    long limite = (long)sqrt(n);
    
    int * tab = NULL;
    tab = listePremiers(limite);

    int i = 0;

    for(i = 0; i < limite; ++i)
    {
        if(tab[i] != 0)
        {
            if(n % tab[i] == 0)
            {
                printf("%d\n", tab[i]);
            }
        }
    }

    free(tab);
    return 0;
}

// Vérifie si n est premier
int premier(int n)
{
    int i = 0, limite = 0;

    if(n == 1)
        return 0;
    else if(n < 4) // 2 et 3 sont des nombres premiers
        return 1;
    else if(n % 2 == 0)
        return 0;
    else if(n < 9) // 4, 6, et 8 ont été exclus par la condition précédente
        return 1;
    else if(n % 3 == 0)
        return 0;
    else
    {
        limite = (int)sqrt(n);
        i = 5;
        while(i <= limite)
        {
            if(n % i == 0)
                return 0;
            if(n % (i + 2) == 0)
                return 0;
            i += 6;
        }
        return 1;
    }
}

// Retourne la liste des nombres premiers inférieurs à n
int * listePremiers(long n)
{
    int * liste = NULL;
    liste = (int*)malloc (sizeof(int) * n);
    
    int i = 0, j = 0;
    liste[j] = 2;
    for(i = 3; i < n; i+=2)
    {
        if(premier(i))
        {
            j++;
            liste[j] = i;
        }
    }

    return liste;
}

